package xyz.molzhao.cfapi;

import xyz.molzhao.util.CommonUtil;

import java.util.concurrent.CompletableFuture;

/**
 * 场景：
 * 小明做800路公交回家，又拿起了电话和朋友聊起了游戏，这时候公交撞大树了，这时小明打滴滴回家。
 *
 * exceptionally就是遇到异常之后，小明处理异常的步骤，exceptionally当然不只可以加在尾部
 * 还能在上面的链式中任何一步加。
 */
public class Exceptionally {
    public static void main(String[] args) {
        CommonUtil.createBehavior("小明走出餐厅， 来到公交站");
        CommonUtil.createBehavior("等待 700路 或者 800路 公交到来");

        CompletableFuture<String> bus = CompletableFuture.supplyAsync(() -> {
            CommonUtil.createBehavior("700路公交车正在赶来。。", 2000);
            return "700路公交到了";
        }).applyToEither(CompletableFuture.supplyAsync(() -> {
            CommonUtil.createBehavior("800路公交车正在赶来。。", 1000);
            return "800路公交到了";
        }), first -> {
            CommonUtil.createBehavior(first);
            if (first.startsWith("800")) {
                throw new RuntimeException("撞树了。。");
            }
            return first;
        }).exceptionally(e -> {
            CommonUtil.createBehavior(e.getMessage());
            CommonUtil.createBehavior("小明叫滴滴");
            return "滴滴叫到了";
        });

        CommonUtil.createBehavior(String.format("%s,小明坐车回家", bus.join()));
    }
}
